/*
 * Debugger.as
 *
 * Copyright (C) 2011 - Dr.NP
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @package org.bsgroup.bsp.utils
 * @author Dr.NP <np@bsgroup.org>
 * @update 07/10/2012
 * @changelog 
 * 		[07/10/2012] - Creation
 */
package org.bsgroup.bsp.utils
{
	import flash.display3D.IndexBuffer3D;
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	
	public class Debugger
	{
		public function Debugger()
		{
		}
		
		public static function trace_hex(d : ByteArray) : String
		{
			var output : String = '';
			var ret : String = '';
			var curr : String;

			for (var i : int = 0; i < d.length; i ++)
			{
				curr = d[i].toString(16);

				if (curr.length < 2)
				{
					curr = '0' + curr;
				}

				if (i % 0x10 == 0)
				{
					ret += "\n";
				}

				else if (i % 0x8 == 0)
				{
					ret += '  ';
				}

				ret += ' ' + curr;
			}

			output = 'Trace binary data : (' + d.length + ') bytes' + ret;
			//trace(output);
			return ret;
		}

		public static function dump_bytearray(b : ByteArray) : String
		{
			if (!b)
			{
				return '';
			}
			
			var ret : String = b.readUTFBytes(b.bytesAvailable);
			
			return ret;
		}
		
		public static function dump_object(o : Object) : String
		{
			var _dump_object : Function = function (o : Object, indent : int = 0) : String
						{
							var rtn : String = new String();
							for (var key : String in o)
							{
								var idt : String = "";
								for (var i : uint = 0; i < indent; i ++)
								{
									idt += "\t";
								}
								
								if (o[key] is String)
								{
									//trace(idt + "[" + key + "] => " + o[key].toString());
									rtn += idt + "[" + key + "] => " + o[key].toString() + "\n";
								}
									
								else if (o[key] is Number)
								{
									//trace(idt + "[" + key + "] => " + o[key].valueOf());
									rtn += idt + "[" + key + "] => " + o[key].valueOf() + "\n";
								}
									
								else if (o[key] is Array)
								{
									//trace(idt + "[" + key + "] => Array");
									rtn += idt + "[" + key + "] => Array\n" + _dump_array(o[key], indent + 1);
								}
									
								else if (o[key] is Object)
								{
									//trace(idt + "[" + key + "] => Object");
									rtn += idt + "[" + key + "] => Object\n" + _dump_object(o[key], indent + 1);
								}
									
								else
								{
									//trace(idt + "[" + key + "] => Unknown data type");
									rtn += idt + "[" + key + "] => Unknown data type\n";
								}
							}
							
							if (indent == 0)
							{
								//trace("=============================================================");
							}
							
							rtn += "\n";
							return rtn;
						}
			
			var _dump_array : Function = function (o : Array, indent : int = 0) : String
						{
							var rtn : String = new String();
							for (var key : uint = 0; key < o.length; key ++)
							{
								var idt : String = "";
								for (var i : uint = 0; i < indent; i ++)
								{
									idt += "\t";
								}
								
								if (o[key] is String)
								{
									//trace(idt + "[" + key + "] => " + o[key].toString());
									rtn += idt + "[" + key + "] => " + o[key].toString() + "\n";
								}
									
								else if (o[key] is Number)
								{
									//trace(idt + "[" + key + "] => " + o[key].valueOf());
									rtn += idt + "[" + key + "] => " + o[key].valueOf() + "\n";
								}
									
								else if (o[key] is Array)
								{
									//trace(idt + "[" + key + "] => Array");
									rtn += idt + "[" + key + "] => Array\n" + _dump_array(o[key], indent + 1);
								}
									
								else if (o[key] is Object)
								{
									//trace(idt + "[" + key + "] => Object");
									rtn += idt + "[" + key + "] => Object\n" + _dump_object(o[key], indent + 1);
								}
									
								else
								{
									//trace(idt + "[" + key + "] => Unknown data type");
									rtn += idt + "[" + key + "] => Unknown data type\n";
								}
							}
							
							rtn += "\n";
							return rtn;
						}
			var rtn : String = _dump_object(o);
			
			return rtn;
		}
	}
}